
import java.util.ArrayList;
import java.util.List;
import java.io.DataInputStream;
import java.io.IOException;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *Util : collection des fonctions qui va faire les fonctions supplementaire comme : traiter les fichier de données
 * @author ntthinh
 */
public class Util {
    /*
     * getCategoryType : retourner le type de mot correspondant
     * line: une ligne dans le fichier de donnees
     * [1, NOM, « bail », <MASC, « baux »>]
     */

    public static CategoryType getCategoryType(String line) {
        int i = line.indexOf(",");//position de la premiere ","
        int j = line.indexOf(",", i + 1);//position de la deuxieme ","
        String tmpType = line.substring(i + 1, j).trim();//le type
        //si le type est noun
        if (tmpType.equals("NOM")) {
            return CategoryType.NOM;
            //adj
        } else if (tmpType.equals("ADJ")) {
            return CategoryType.ADJ;
        }
        //verbre
        return CategoryType.VERB;
    }
    /*
     *getTerm : retourner le term de ce mot correspondant
     * line: une ligne dans le fichier de donnees
     *[1, NOM, « bail », <MASC, « baux »>]
     */

    public static String getTerm(String line) {
        int i = line.indexOf("«");
        int j = line.indexOf("»", i + 1);
        return line.substring(i + 1, j - 1).trim();
    }
    /*
     * getProperties :  retourner une liste des proprietes du mot qui correspond cette ligne
     * line: une ligne dans le fichier de donnees
     * [1, NOM, « bail », <MASC, « baux »>]
     */

    public static List getProperties(String line) {
        //recevoir le type de ce mot correspondant
        CategoryType type = getCategoryType(line);
        List properties = new ArrayList();//liste des proprietes
        int s = -1; //separation
        int i = line.indexOf("<");
        int j = line.indexOf(">", i + 1);
        //texte contient les proprietes
        String strProperties = line.substring(i + 1, j).trim();
        switch (type) {
            //type est noun
            case NOM: {
                i = strProperties.indexOf(",");
                //genre
                String genre = strProperties.substring(0, i).trim();
                //creer une propriete genre pour stocker la propriete genre
                PropertyImpl pGenre = new PropertyImpl();
                pGenre.setPropertyType(PropertyType.GENRE);
                if (genre.equals("MASC")) {
                    pGenre.setGenre(CodeGenre.MASC);
                } else {
                    pGenre.setGenre(CodeGenre.FEM);
                }
                //ajouter cet propriete a la liste
                properties.add(pGenre);

                //Pluriel
                i = strProperties.indexOf("«");
                j = strProperties.indexOf("»", i + 1);
                String pluriel = strProperties.substring(i + 1, j - 1).trim();
                //propriete Pluriel
                PropertyImpl pPluriel = new PropertyImpl();
                pPluriel.setPropertyType(PropertyType.PLURIEL);
                pPluriel.setPluriel(pluriel);
                //ajouter cette propriete a la liste
                properties.add(pPluriel);
                break;
            }
            //type est adj
            //[2, ADJ, « banal », <« banale », « banals »>]
            case ADJ: {
                //recuperer Feminin
                i = strProperties.indexOf("«");
                j = strProperties.indexOf("»", i + 1);
                String feminin = strProperties.substring(i + 1, j - 1).trim();
                //creer une propriete pour stocker la propriete Feminin
                PropertyImpl pFeminin = new PropertyImpl();
                pFeminin.setPropertyType(PropertyType.FEMININ);
                pFeminin.setFeminin(feminin);
                //ajouter cette propriete a la liste
                properties.add(pFeminin);

                //recuperer Pluriel
                s = strProperties.indexOf(",");
                i = strProperties.indexOf("«", s);
                j = strProperties.indexOf("»", i + 1);
                String pluriel = strProperties.substring(i + 1, j - 1).trim();
                //creer une propriete pour stocker la propriete Pluriel
                PropertyImpl pPluriel = new PropertyImpl();
                pPluriel.setPropertyType(PropertyType.PLURIEL);
                pPluriel.setPluriel(pluriel);
                //ajouter cette propriete a la liste
                properties.add(pPluriel);
                break;

            }
            //verbre
            //[3, VERB, « alourdir », <3, TRANS>]
            case VERB: {
                s = strProperties.indexOf(",");
                //groupe
                //recuperer le chaine de groupe
                String group = strProperties.substring(0, s).trim();
                //creer la propriete Group
                PropertyImpl pGroup = new PropertyImpl();
                pGroup.setPropertyType(PropertyType.GROUPE);
                pGroup.setGroupe(Short.parseShort(group));
                //et ajouter cette propriete a la liste
                properties.add(pGroup);

                // Transitivité
                String transitive = strProperties.substring(s + 1).trim();
                PropertyImpl pTransitive = new PropertyImpl();
                pTransitive.setPropertyType(PropertyType.TRANSIVITE);
                if (transitive.equals("TRANS")) {
                    pTransitive.setTrans(CodeTrans.TRANS);
                } else {
                    pTransitive.setTrans(CodeTrans.INTR);
                }
                //et ajouter cette propriete a la liste
                properties.add(pTransitive);
                break;
            }

        }
        return properties;

    }
    /*
     *getWord : retourner un mot correspondant avec cette ligne
     * line: une ligne dans le fichier de donnees
     * [1, NOM, « bail », <MASC, « baux »>]
     */

    public static Word getWord(String line) {
        //creer un nouveau mot correspondant
        WordImpl word = new WordImpl();
        word.setTerm(getTerm(line));
        //creer une categorie correspondante
        CategoryImpl categ = new CategoryImpl();
        categ.setCategory(getCategoryType(line));
        word.setMyCategory(categ);
        //recuperer une liste des proprietes correspondantes
        List listProperties = getProperties(line);
        for (int i = 0; i < listProperties.size(); i++) {
            Property tmpProperty = (Property) listProperties.get(i);
            word.addProperty(tmpProperty);
        }
        //retourner ce mot
        return word;
    }
    /*
     *getDefinition : retourner la definition d'un mot correspondant avec cette ligne
     * line: une ligne dans le fichier de donnees
     */

    public static String getDefinition(String line) {
        int i = line.indexOf("«");
        int j = line.indexOf("»", i + 1);
        return line.substring(i + 1, j - 1).trim();
    }
    /*
     * readTerm() : entrer un term a partir du clavier
     *
     */

    public static String readTerm(DataInputStream in) throws IOException {
        System.out.print("Enter term:");
        return in.readLine();
    }
    /*
     * readCategoryType : entrer la categorie a partir du clavier
     */

    public static CategoryType readCategoryType(DataInputStream in) throws IOException {
        System.out.print("Enter Category [1=Nom], [2=Adj], [3=Verb]:");
        while (true) {

            String type = in.readLine();
            if (type.equals("1")) {
                return CategoryType.NOM;
            }
            if (type.equals("2")) {
                return CategoryType.ADJ;
            }
            if (type.equals("3")) {
                return CategoryType.VERB;
            }
            System.out.println("Category is not correct, try again! ([1=Nom], [2=Adj], [3=Verb])");
        }
    }
    /*
     *readDefinition : entrer la definition d'un mot a partir de clavier
     */

    public static String readDefinition(DataInputStream in) throws IOException {
        System.out.print("Enter definition:");
        return in.readLine();
    }
  /*
   * readGenre : entrer la genre : MASC ou FEM
   */
    public static CodeGenre readGenre(DataInputStream in) throws IOException {
         System.out.print("Enter Genre [1=Male],[ 2=Female]:");
        while (true) {
            String codeGenre = in.readLine();
            if (codeGenre.equals("1")) {
                return CodeGenre.MASC;
            }
            if (codeGenre.equals("2")) {
                return CodeGenre.FEM;
            }
         System.out.println("Genre is not correct, try again! ([1=Male], [2=Female]");
        }
    }
/*
 *readPluriel : entrer le mot pluriel corrrespondant a partir du clavier
 */
    public static String readPluriel(DataInputStream in) throws IOException {
        System.out.print("Enter the plural:");
        return in.readLine();
    }
/*
 *readFeminin : entrer le mot feminin corrrespondant a partir du clavier
 */
    public static String readFeminin(DataInputStream in) throws IOException {
        System.out.print("Enter the female:");
        return in.readLine();
    }
/*
 *readTransitive : entrer le mot pluriel corrrespondant a partir du clavier
 */
    public static CodeTrans readTransitive(DataInputStream in) throws IOException {
        System.out.print("Enter transitivite [1=Transitif], [2=Intransitif]:");
        while (true) {   
            String sTransitive = in.readLine();
            if (sTransitive.equals("1")) {
                return CodeTrans.TRANS;
            }
            if (sTransitive.equals("2")) {
                return CodeTrans.INTR;
            }
            System.out.print("Transitivite is incorrect, please try again!( [1=Transitif], [2=Intransitif])");
        }
    }
/*
 *readGroupe
 */
    public static short readGroupe(DataInputStream in) throws IOException {
        System.out.print("Enter groupe [1=Groupe 1], [2=Groupe 2], [3=Groupe 3]:");
        while (true) {    
            String sGroupe = in.readLine();
            if (sGroupe.equals("1")) {
                return 1;
            }
            if (sGroupe.equals("2")) {
                return 2;
            }
            if (sGroupe.equals("3")) {
                return 3;
            }
            System.out.print("Groupe number is incorrect, please try again! [1=Groupe 1], [2=Groupe 2], [3=Groupe 3]:");       

        }
    }
}
